/**
 * 
 */
package twitter;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.Set;

import com.aliasi.classify.PrecisionRecallEvaluation;
import com.aliasi.cluster.ClusterScore;

/**
 * @author Fernando
 *
 */
public class Evaluation {
	
	private ClusterScore<String> comparadorClusters;
	private PrecisionRecallEvaluation resultados;
	private Set<Set<String>> cjtoTrabajo;
	private Set<Set<String>> cjtoReferencia;
	
	public Evaluation(Set<Set<String>> cjtoRef, Set<Set<String>> cjtoTrjo){
		cjtoReferencia=cjtoRef;
		cjtoTrabajo=cjtoTrjo;
		comparadorClusters = new ClusterScore<String>(cjtoReferencia, cjtoTrabajo);
		resultados = comparadorClusters.equivalenceEvaluation();
	}
	
	public double damePrecision(){
		return resultados.precision();
	}
	
	public double dameRecall(){
		return resultados.recall();
	}
	
	public double dameAccuracy(){
		return resultados.accuracy();
	}
	
	public double dameFMeasure(){
		return resultados.fMeasure();
	}
	
	public double[] damePurezaClusters(){
		int numCLusters = cjtoTrabajo.size();
		double[] purezas = new double[numCLusters];
		int[] contadoresClases = new int[numCLusters];
		
		ArrayList<Set<String>> clases = new ArrayList<Set<String>>();
		Iterator<Set<String>> itClases = cjtoReferencia.iterator();
		while (itClases.hasNext()) {
			Set<java.lang.String> set = itClases.next();
			clases.add(set);
		}
		
		Iterator<Set<String>> iteradorClusters = cjtoTrabajo.iterator();
		int indiceCluster=0;
		while (iteradorClusters.hasNext()){
			Set<String> cluster = iteradorClusters.next();
			Iterator<String> iteradorTwitts = cluster.iterator();
			for (int i = 0; i < contadoresClases.length; i++) {
				contadoresClases[i]=0;
			}
			while (iteradorTwitts.hasNext()) {
				String twit = iteradorTwitts.next();
				for (int i = 0; i < clases.size(); i++) {
					if (clases.get(i).contains(twit)){
						contadoresClases[i]++;
						break;
					}
				}
			}
			int max=Integer.MIN_VALUE;
			for (int i=0; i<contadoresClases.length; i++){
				if (contadoresClases[i]>max){
					max=contadoresClases[i];
				}
			}
			purezas[indiceCluster]=((double)max)/((double)cluster.size());
			indiceCluster++;
		}
		return purezas;
	}

}
